package com.atnjupt.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author Wizarder
 * @create 2021-05-25 22:25
 */
public class JDBCUtils {

    private static DataSource  ds;

    private static ThreadLocal<Connection> conn = new ThreadLocal<>();
    static{
        InputStream rs = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");//这里必须这样写，
        //别用Eclipse的写法，会出错。
        Properties pr = new Properties();
        try {
            pr.load(rs);
            ds = DruidDataSourceFactory.createDataSource(pr);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接池连接
     * @return 返回Connection连接对象，如果返回Null表示连接失败了
     */
    public static Connection getConnection()  {

        Connection connection = conn.get();
        if (connection == null){

            try {
                connection = ds.getConnection();
                conn.set(connection);//保存到ThreadLocal对象中，供Jdbc操作使用
                connection.setAutoCommit(false);//设置为手动管理事物
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        return connection;
    }
    public static void commitAndClose(){
        Connection connection = conn.get();
        if(connection != null){
            //如果非空，说明以前调用过
            try {
                connection.commit();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {
                try {
                    connection.close();//关闭连接
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
        // 一定要执行 remove 操作，否则就会出错。（因为 Tomcat 服务器底层使用了线程池技术）
        conn.remove();
    }

    public static void rollBackAndClose(){
        Connection connection = conn.get();
        if(connection != null){
            //connection非空说明这个连接调用过，
            try {
                connection.rollback();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {
                try {
                    connection.close();//关闭连接
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
        // 一定要执行 remove 操作，否则就会出错。（因为 Tomcat 服务器底层使用了线程池技术）
        conn.remove();
    }
    /*public static void close(Connection conn){
        try {
            if(conn != null)
            conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }*/

    public static void main(String[] args) {

    }
}
